﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Collections.Generic;


using Business;

namespace Data
{

    public class DataUtilizador
    {

        public DataUtilizador()
        {

        }

        public String getLoc(int idLoc)
        {
            Connect c = new Connect();
            String loc = "";
            try
            {
                SqlConnection conn = c.connect("");
                SqlCommand command = conn.CreateCommand();
                command.CommandText = "SELECT localidade FROM Localidade WHERE idLocalidade=" + idLoc;
                SqlDataReader leitor = command.ExecuteReader();
                if (leitor.Read())
                    loc = Convert.ToString(leitor[0]);
                leitor.Close();
            }
            catch (SqlException ex)
            {
                Console.WriteLine(ex.Message);
            }
            return loc;
        }

        public int getIdLoc(String loc)
        {
            Connect c = new Connect();
            int idloc = -1;
            try
            {
                SqlConnection conn = c.connect("");
                SqlCommand command = conn.CreateCommand();
                command.CommandText = "SELECT idLocalidade FROM Localidade WHERE localidade='"+loc+"'";
                SqlDataReader leitor = command.ExecuteReader();
                if (leitor.Read())
                    idloc = Convert.ToInt16(leitor[0]);
                leitor.Close();
            }
            catch (SqlException ex)
            {
                Console.WriteLine(ex.Message);
            }
            return idloc;
        }


        // Vai buscar um utilizador pelo seu ID

        public Utilizador getUtilizadorByID(int utilizadorID)
        {
            Connect c = new Connect();
            Utilizador newUser = new Utilizador();
            try
            {
                SqlConnection conn = c.connect("");
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = "SELECT * FROM Utilizador WHERE idUtilizador=" + utilizadorID + " ";

                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.Read())
                {

                    int userID = Convert.ToInt32(reader[0]);
                    String nome = Convert.ToString(reader[2]);
                    String username = Convert.ToString(reader[1]);
                    String password = Convert.ToString(reader[3]);
                    String email = Convert.ToString(reader[4]);
                    String rua = Convert.ToString(reader[5]);
                    String codPostal = Convert.ToString(reader[6]);
                    int status = Convert.ToInt32(reader[8]);
                    cmd.CommandText = "SELECT localidade FROM Localidade WHERE idLocalidade='" + reader[7] + "'";
                    reader.Close();
                    SqlDataReader leitor = cmd.ExecuteReader();
                    String localidade = "";
                    if (leitor.Read())
                        localidade = Convert.ToString(leitor[0]);


                    newUser = new Utilizador(username, nome, password, email, rua, codPostal, localidade);
                    newUser.setIDUtilizador(userID);
                    newUser.setStatus(status);
                }
                reader.Close();
                conn.Close();
            }

            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }
            return newUser;
        }


        // Insere um novo utilizador na base de dados
        public int insertUtilizador(Utilizador utilizador)
        {
            int value = -1;
            Connect c = new Connect();
            try
            {
                SqlConnection conn = c.connect("");
                
                // Vai buscar ID da localidade
                SqlCommand command = conn.CreateCommand();
                command.CommandText = "SELECT idLocalidade FROM Localidade WHERE localidade='"+utilizador.getLocalidade()+"'";
                SqlDataReader leitor = command.ExecuteReader();
                int loc = -1;
                if (leitor.Read())
                    loc = Convert.ToInt16(leitor[0]);
                leitor.Close();
                // Insere o utilizador
                command.CommandText = "INSERT INTO Utilizador(username,nome,password,email,rua,codPostal,Localidade_idLocalidade) VALUES " + " ('" + utilizador.getUsername() + "','" + utilizador.getNome() + "','" + utilizador.getPassword() + "','" + utilizador.getRua() + "','" + utilizador.getCodPostal() + "',"+loc+",1)";
                
                int i = command.ExecuteNonQuery();

                // Vai buscar o ID mais recente
                command.CommandText = "SELECT MAX(idUtilizador) FROM Utilizador";
                SqlDataReader reader = command.ExecuteReader();
                if (reader.Read())
                    value = Convert.ToInt16(reader[0]);

                // Vai buscar o status do utilizador com o ID mais recente
                command.CommandText = "SELECT status FROM Utilizador where idUtilizador=" + value;
                reader.Close();
                int status = -1;
                
                reader = command.ExecuteReader();
                if (reader.Read())
                    status = Convert.ToInt16(reader[0]);

                utilizador.setStatus(status);
                conn.Close();
            }
            catch (SqlException ex)
            {
                Console.WriteLine(ex.Message);
            }

            return value;
        }

        public bool setEstadoUtilizador(int utilizadorID, int novoEstado)
        {
            bool value = false;
            Connect c = new Connect();
            try
            {
                SqlConnection conn = c.connect("");
                SqlCommand command = conn.CreateCommand();

                command.CommandText = "UPDATE Utilizador SET status=" + novoEstado + " WHERE (idUtilizador=" + utilizadorID + ")";
                int i = command.ExecuteNonQuery();
                if (i > 0) value = true;
                conn.Close();
            }
            catch (SqlException ex)
            {
                Console.WriteLine(ex.Message);
            }
            return value;
        }

        public bool updateUtilizador(Utilizador utilizador)
        {
            int i = 0;
            bool value = false;
            Connect c = new Connect();
            try
            {
                SqlConnection conn = c.connect("");
                SqlCommand command = conn.CreateCommand();

                int loc = getIdLoc(utilizador.getLocalidade());

                command.CommandText = "UPDATE Utilizador SET username='" + utilizador.getUsername() + "',nome='" + utilizador.getNome() + "',email='" + utilizador.getEmail() + "',rua='" + utilizador.getRua() + "',codPostal='" + utilizador.getCodPostal() + "',Localidade_idLocalidade="+loc+" WHERE (idUtilizador=" + utilizador.getIDUtilizador() + ")";
                i = command.ExecuteNonQuery();
                if (i > 0) value = true;

                conn.Close();
            }
            catch (SqlException ex)
            {
                Console.WriteLine(ex.Message);
            }
            return value;
        }


        public Utilizador validateLogin(String username, String password)
        {
            int userID = -1;
            Utilizador newUser = new Utilizador();
            Connect c = new Connect();
            try
            {
                SqlConnection conn = c.connect("");
                SqlCommand cmd = conn.CreateCommand();

                cmd.CommandText = "SELECT * FROM Utilizador WHERE username='" + username + "' AND password='" + password + "'";

                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.Read())
                {
                    userID = Convert.ToInt32(reader[0]);
                    newUser = new Utilizador(getUtilizadorByID(userID));
                }


            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            return newUser;

        }


        public ListaUtilizador getListaUsers(int status)
        {
            Utilizador user = null;
            Connect c = new Connect();
            ListaUtilizador lu = new ListaUtilizador();
            try
            {
                SqlConnection conn = c.connect("");
                SqlCommand command = conn.CreateCommand();

                if (status == -10)
                    command.CommandText = "Select * from Utilizador";
                else
                    command.CommandText = "Select * from Utilizador where status=" + status;
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    String loc = getLoc(Convert.ToInt16(reader[7]));
                    user = new Utilizador(Convert.ToInt32(reader[0]),Convert.ToString(reader[1]), Convert.ToString(reader[2]), Convert.ToString(reader[3]), Convert.ToString(reader[4]), Convert.ToString(reader[5]), Convert.ToString(reader[6]),loc);
                    user.setStatus(Convert.ToInt16(reader[8]));
                    lu.addUser(user);
                }
                reader.Close();

                conn.Close();
            }
            catch (SqlException ex)
            {
                Console.WriteLine(ex.Message);
            }

            return lu;
        }
    }
}